function uuid() {
    function s4() {
        return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);
    }

    return s4() + s4() + "-" + s4() + "-" + s4() + "-" + s4() + "-" + s4() + s4() + s4();
}

function HexToBase64(hex) {
    var base64Digits = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    var base64 = "";
    var group;

    for (var i = 0; i < 30; i += 6) {
        group = parseInt(hex.substr(i, 6), 16);
        base64 += base64Digits[(group >> 18) & 0x3f];
        base64 += base64Digits[(group >> 12) & 0x3f];
        base64 += base64Digits[(group >> 6) & 0x3f];
        base64 += base64Digits[group & 0x3f];
    }

    group = parseInt(hex.substr(30, 2), 16);
    base64 += base64Digits[(group >> 2) & 0x3f];
    base64 += base64Digits[(group << 4) & 0x3f];
    base64 += "==";

    return base64;
}

function NUUID(uuid) {
    var hex = uuid.replace(/[{}-]/g, ""); // remove extra characters
    var a = hex.substr(6, 2) + hex.substr(4, 2) + hex.substr(2, 2) + hex.substr(0, 2);
    var b = hex.substr(10, 2) + hex.substr(8, 2);
    var c = hex.substr(14, 2) + hex.substr(12, 2);
    var d = hex.substr(16, 16);
    hex = a + b + c + d;
    var base64 = HexToBase64(hex);
    return new BinData(3, base64);
}

var events = db.CriteriaLevel2.findOne({ Name: 'Events' });
var newName = "Access to Basic Services";
var newMainTag = "Access to Basic Services";
var eventIndicatorSuffixes = ["Answer Category", "Summary"]
var tagSuffixes = ["Risk Answer Category", "Impact Answer Category", "Answer Category"]

if (events) {
    db.CriteriaLevel3.remove({ CriteriaLevel2Id: events._id, Name: newName })

    db.CriteriaLevel3.insert({
        _id: NUUID(uuid()),
        Name: newName,
        ShortName: '',
        Order: NumberInt(240),
        CriteriaLevel2Id: events._id,
        Category: 'None'
    })

    eventCriteriaLevel3 = db.CriteriaLevel3.findOne({ CriteriaLevel2Id: events._id, Name: newName });

    eventIndicatorSuffixes.forEach(function (suffix, index) {
        var name = newName + "-" + suffix;
        var toBeRemoved = db.TemplateCriteria.findOne({ Name: name, CriteriaType: 2 });
        
        if (toBeRemoved) {
            db.TemplateCriteria.remove(toBeRemoved);
        }

        db.TemplateCriteria.insert({
            _id: NUUID(uuid()),
            Name: name,
            CriteriaEntity: null,
            CriteriaEntityField: name,
            CriteriaLevel2Id: eventCriteriaLevel3.CriteriaLevel2Id,
            CriteriaLevel3Id: eventCriteriaLevel3._id,
            CriteriaType: NumberInt(2),
            IsScreenable: suffix == "Answer Category"
        })
    });
}

var incidents = db.CriteriaLevel2.findOne({ Name: 'Incidents' });

if (incidents) {
    db.CriteriaLevel3.remove({ CriteriaLevel2Id: incidents._id, Name: newName })

    db.CriteriaLevel3.insert({
        _id: NUUID(uuid()),
        Name: newName,
        ShortName: '',
        Order: NumberInt(240),
        CriteriaLevel2Id: incidents._id,
        Category: newName
    })

    var incidentsCriteriaLevel3 = db.CriteriaLevel3.findOne({ Name: newName, Category: newName });

    tagSuffixes.forEach(function (suffix, index) {
        var name = newName + " - " + newMainTag + "-" + suffix;
        var toBeRemoved = db.TemplateCriteria.findOne({ Name: name, CriteriaType: 9 });

        if (toBeRemoved) {
            db.TemplateCriteria.remove(toBeRemoved);
        }

        db.TemplateCriteria.insert({
            _id: NUUID(uuid()),
            Name: name,
            CriteriaEntity: null,
            CriteriaEntityField: name,
            CriteriaLevel2Id: incidentsCriteriaLevel3.CriteriaLevel2Id,
            CriteriaLevel3Id: incidentsCriteriaLevel3._id,
            CriteriaType: NumberInt(9),
            IsScreenable: suffix == "Answer Category"
        })
    });
}